#!/usr/bin/perl

# use strict;
use locale;
use open ":utf8";

my $input=""; # texte à traduire
# my $mode="";
my $dico=""; #dictionnaire français-anglais

# my $rappel=0;
# my $precision=0;
# my $fmesure=0;

my $option;
my $i;
my %categories;
my %traductions;
my @texte_traduit;

if (@ARGV < 2)
{ die("Utilisation: ./tradauto.pl <fichier dictionnaire> <fichier à traduire>"); }
else
{
	
			 $input=$ARGV[1];
			 $dico=$ARGV[0];
		
}

print $input;
open(FLUX,"tree-tagger-french $input |") or die ("impossible d'exécuter le fichier $input");
        while (<FLUX>)
        {
                if (/(.*)\t(.*)\t(.*)/)
                {
                        $categories{$1}=$2;
                }
        }
close(FLUX);
print "Catégories récupérées\n";
# }
# récupérer les traductions de chaque mot dans le dictionnaire
foreach $mot (keys %categories)
{
#         print $mot;
# 	open(RES,"$dico | grep \"^".$mot."\s[(]".$categories{$mot}."[)]\" |");
	open(RES,"<$dico");
	while (<RES>)
	{
		$mot=~s/[(]//;
		$mot=~s/[)]//;
		$mot=~s/\[//;
		$mot=~s/\]//;
		$mot=~s/[^\w]//;
# 		print "$mot\n";
		if (/$mot\s[(](.+)[)](.*)/)
		{
			my $resultats=$2;
			# Traductions possibles pour ce mot, séparées par '|'. Il faudra les séparer lors de la recherche des combinaisons
			$traductions{$mot}=$resultats;
			#print "$mot\n";
		}
# 		else
# 		{
# 		  print "Traduction non trouvée pour $mot\n";
# 		}
	}
}
print "Traductions récupérées\n";
# former les séquences de mots candidats à la traduction (fenêtre de 2 ou 3)

# patrons
# Nom1 de Nom2 => Nom2 Nom1 state 1
# Nom1 Adj => Adj Nom state 2


$state=0;
my @buffer;
my @patrons;
my @vars;

# patrons à mettre dans un fichier si possible
open(PATRONS,"patrons.txt");
while ($line=<PATRONS>)
{
	push(@patrons,$line);
}
close(PATRONS);

my @mots = keys(%categories);
my $indCourant=0;
while ($indCourant < @mots )
{
  print "indCourant=$indCourant\n";
  $indPatron=0;
  
  while ($indPatron < @patrons)
  {
    print "indPatron=$indPatron\n";
    $patron=$patrons[$indPatron];
    @parties=split /=>/,$patron;
    @aReconnaitre=split /,/,$parties[0];
    @aTraduire=split /,/,$parties[1];
    my $indPartieCourante=0;
#     my $patronNotMatched=1;
    while ($indPartieCourante < @aReconnaitre)
    {
      print "indPartieCourante=$indPartieCourante\n";
      $entite=$aReconnaitre[$indPartieCourante];
      if ($entite=~/(\w+):(.*)/)
      {
        $type=$1;
        $instance=$2;
        if ($type eq "cat")
        {
          if ($instance=~/(w+)[(](\d+)[)]/)
          {
            $cat=$1;
            $idVar=$2;
            if ($categories{$mots[$indCourant]} eq $cat)
            {
              push(@vars,$mots[$indCourant]);
              $indPartieCourante++;
              $indCourant++;
            }
            elsif ($categories{$mots[$indCourant]} eq "NOM")
            {
	      $mot=$mots[$indCourant];
	      $trad=$traductions{$mot};
              push(@texte_traduit,"$mot=>$trad");
              $vars=();
              $indPatron++;
              #$indCourant -= $indPartieCourante+1;
#               $patronNotMatched=0;
              break;
            }
           }
         
        }
        elsif ($type eq "word")
        {
          if ($mots[$indCourant] eq $instance)
          {
            $indCourant++;
            $indPartieCourante++;
          }
           elsif ($categories{$mots[$indCourant]} eq "NOM")
            {
	      $mot=$mots[$indCourant];
	       $trad=$traductions{$mot};
              push(@texte_traduit,"$mot=>$trad");
              $vars=();
              $indPatron++;
              #$indCourant -= $indPartieCourante+1;
#               $patronNotMatched=0;
              break;
            }
        }
      }
     $indPartieCourante++;
    }
    if (@vars > 0) # on a reconnu le patron
    {
      foreach $elem (@aTraduire)
      {
        if ($elem=~/[(](\d+)[)]/)
        {
          $indice=$1;
          # TODO: probabilité la plus forte pour ne garder qu'une traduction (validation par moteur de recherche)
          push(@texte_traduit,"$vars[$indice+1]:$traductions{$vars[$indice+1]}");
          
        }
      }
      $vars=();
    }
    
    $indPatron++;
    
  }
  $indCourant++;
}
open(TRADUC,">traducs.txt");

foreach $trad (@texte_traduit)
{
	print TRADUC $trad."\n";
}

close(TRADUC);

